#include "unit_status_common.h"
#include "FSMC_SRAM.h"
#include "device_resource.h"
Modbus_AllData *swap_all_data = (Modbus_AllData *)MODBUS_READ_RESPONSE_SWAP_BUF;
MessageData *send_message = (MessageData *)UINT_STATUS_POOL;
// 1. 从数据段提取16位无符号整数（大端）
static uint16_t modbus_get_uint16(const uint8_t *data_buf, uint16_t offset)
{
  return (uint16_t)(data_buf[offset] << 8) | data_buf[offset + 1];
}

// 2. 从数据段提取32位有符号整数（大端，双寄存器）
static int32_t modbus_get_int32(const uint8_t *data_buf, uint16_t offset)
{
  return (int32_t)((uint32_t)data_buf[offset] << 24) |
         ((uint32_t)data_buf[offset + 1] << 16) |
         ((uint32_t)data_buf[offset + 2] << 8) |
         (uint32_t)data_buf[offset + 3];
}

// 3. 从数据段提取32位无符号整数（大端，双寄存器）
static uint32_t modbus_get_uint32(const uint8_t *data_buf, uint16_t offset)
{
  return (uint32_t)data_buf[offset] << 24 |
         (uint32_t)data_buf[offset + 1] << 16 |
         (uint32_t)data_buf[offset + 2] << 8 |
         (uint32_t)data_buf[offset + 3];
}

// 4. 波特率映射（文档0x1800低字节定义）
static uint32_t modbus_map_baud(uint8_t baud_code)
{
  switch (baud_code)
  {
  case 0:
    return 19200;
  case 1:
    return 9600;
  case 2:
    return 4800;
  default:
    return 9600; // 默认9600
  }
}

// 5. 校验位映射（文档0x1801高字节定义，返回字符串便于打印）
static const char *modbus_map_parity(uint8_t parity_code)
{
  //  switch (parity_code)
  //  {
  //  case 0:
  //    return "无校验";
  //  case 2:
  //    return "偶校验";
  //  case 4:
  //    return "奇校验";
  //  default:
  //    return "未知";
  //  }
	return 0;
}

// 6. 停止位映射（文档0x1801低字节定义）
static const char *modbus_map_stop_bit(uint8_t stop_code)
{
  //  return (stop_code == 0) ? "1位" : "2位";
	return 0;
}

/**
 * @brief 解析0x1800~0x181B寄存器（通讯参数+部分运行状态）
 * @param resp_buf：完整应答帧
 * @param resp_len：应答帧长度
 * @param all_data：总数据结构体（输出参数）
 * @return 0=成功，-1=帧错误，-2=数据长度不匹配
 */
int modbus_parse_1800_181B(const uint8_t *resp_buf, uint16_t resp_len, Modbus_AllData *all_data)
{
  // 1. 验证应答帧合法性（最小长度：1(从站)+1(功能码)+1(数据长)+28寄存器×2(数据)+2(CRC)= 61字节）
  if (resp_len < 61)
    return -1;
  if (resp_buf[1] != 0x03)
    return -1; // 功能码必须为0x03
  uint8_t data_len = resp_buf[2];
  if (data_len != 56)
    return -2; // 28寄存器×2=56字节

  // 2. 提取数据段（resp_buf[3]为数据段起始）
  const uint8_t *data_buf = &resp_buf[3];

  // 3. 解析0x1800（设备地址+波特率）
  all_data->comm_param.dev_addr = data_buf[0]; // 0x1800高字节
  uint8_t baud_code = data_buf[1];             // 0x1800低字节
  all_data->comm_param.baud_rate = modbus_map_baud(baud_code);

  // 4. 解析0x1801（校验位+停止位）
  all_data->comm_param.parity = data_buf[2];   // 0x1801高字节
  all_data->comm_param.stop_bit = data_buf[3]; // 0x1801低字节

  // 5. 解析0x1804~0x1805（输入电压1，32位有符号，Y*0.01）
  // int32_t input_volt_raw = modbus_get_int32(data_buf, 8); // 0x1800~0x1803占8字节，0x1804起始偏移8
  // all_data->run_status.input_volt_1 = input_volt_raw * 0.01f;
  all_data->run_status.input_volt_1 = bytes_to_decimal_float(&data_buf[8], 4, 2);
  // 6. 解析0x1806~0x1807（空开电流1，32位有符号，Y*0.01）
  // int32_t current_raw = modbus_get_int32(data_buf, 12); // 0x1804~0x1805占4字节，偏移+4=12
  // all_data->run_status.air_switch_current_1 = current_raw * 0.01f;
  all_data->run_status.air_switch_current_1 = bytes_to_decimal_float(&data_buf[12], 4, 2);

  // 7. 解析0x1808~0x1809（空开功率，32位有符号，Y*0.01）
  // int32_t power_raw = modbus_get_int32(data_buf, 16);
  // all_data->run_status.air_switch_power = power_raw * 0.01f;
  all_data->run_status.air_switch_power = bytes_to_decimal_float(&data_buf[16], 4, 2);

  // 8. 解析0x180E~0x180F（输出电量，32位无符号，Y*0.01）
  // uint32_t output_energy_raw = modbus_get_uint32(data_buf, 28); // 0x180A~0x180D预留，偏移+12=28
  // all_data->run_status.output_energy = output_energy_raw * 0.01f;
  all_data->run_status.output_energy = bytes_to_decimal_float(&data_buf[28], 4, 2);

  // 9. 解析0x1818（端口温度，16位有符号）
  all_data->run_status.port_temp = (int16_t)modbus_get_uint16(data_buf, 52); // 0x1810~0x1817预留，偏移+24=52

  // 10. 解析0x1819（板载温度，16位有符号）
  all_data->run_status.board_temp = (int16_t)modbus_get_uint16(data_buf, 54);

  // 11. 解析0x181A~0x181B（母排计量电压1，32位有符号）
  all_data->run_status.bus_meter_volt_1 = modbus_get_int32(data_buf, 56); // 偏移+2=56（注：数据段总长56，此处为最后4字节）

  return 0;
}

int modbus_parse_1824_1828(const uint8_t *resp_buf, uint16_t resp_len, Modbus_AllData *all_data)
{
  // 合法性验证：1+1+1+5×2+2=15字节
  if (resp_len < 15)
    return -1;
  if (resp_buf[1] != 0x03)
    return -1;
  if (resp_buf[2] != 10)
    return -2; // 5寄存器×2=10字节

  const uint8_t *data_buf = &resp_buf[3];

  // 0x1824（运行状态字）
  all_data->run_status.run_status_word = modbus_get_uint16(data_buf, 0);
  // 0x1825（报警状态字1）
  all_data->run_status.alarm_word1 = modbus_get_uint16(data_buf, 2);
  // 0x1826（报警状态字2）
  all_data->run_status.alarm_word2 = modbus_get_uint16(data_buf, 4);
  // 0x1827~0x1828（输入电量-放电1，32位无符号，Y*0.01）
  // uint32_t input_energy_raw = modbus_get_uint32(data_buf, 6);
  // all_data->run_status.input_energy_discharge_1 = input_energy_raw * 0.01f;
  all_data->run_status.input_energy_discharge_1 = bytes_to_decimal_float(&data_buf[6], 4, 2);

  return 0;
}

int modbus_parse_18A4_18B5(const uint8_t *resp_buf, uint16_t resp_len, Modbus_AllData *all_data)
{
  // 合法性验证：1+1+1+18×2+2=41字节
  if (resp_len < 41)
    return -1;
  if (resp_buf[1] != 0x03)
    return -1;
  if (resp_buf[2] != 36)
    return -2; // 18寄存器×2=36字节

  const uint8_t *data_buf = &resp_buf[3];

  // 0x18A4~0x18A5（输入电压2，32位有符号）
  all_data->run_status.input_volt_2 = modbus_get_int32(data_buf, 0);
  // 0x18A6~0x18A7（空开电流2，32位有符号）
  all_data->run_status.air_switch_current_2 = modbus_get_int32(data_buf, 4);
  // 0x18A8~0x18A9（累计电量，32位无符号，Y*0.01）
  // uint32_t total_energy_raw = modbus_get_uint32(data_buf, 8);
  // all_data->run_status.total_energy = total_energy_raw * 0.01f;
  all_data->run_status.total_energy = bytes_to_decimal_float(&data_buf[8], 4, 2);

  // 0x18AA~0x18AB（输入电量-放电2，32位无符号，Y*0.01）
  // uint32_t input_energy2_raw = modbus_get_uint32(data_buf, 12);
  // all_data->run_status.input_energy_discharge_2 = input_energy2_raw * 0.01f;
  all_data->run_status.input_energy_discharge_2 = bytes_to_decimal_float(&data_buf[12], 4, 2);

  // 0x18AC~0x18AD（输出电量2，32位无符号，Y*0.01）
  // uint32_t output_energy2_raw = modbus_get_uint32(data_buf, 16);
  // all_data->run_status.output_energy_2 = output_energy2_raw * 0.01f;
  all_data->run_status.output_energy_2 = bytes_to_decimal_float(&data_buf[16], 4, 2);

  // 0x18AE（运行状态字2）
  all_data->run_status.run_status_word_2 = modbus_get_uint16(data_buf, 20);
  // 0x18AF（报警状态字1_2）
  all_data->run_status.alarm_word1_2 = modbus_get_uint16(data_buf, 22);
  // 0x18B0（报警状态字2_2）
  all_data->run_status.alarm_word2_2 = modbus_get_uint16(data_buf, 24);
  // 0x18B1（设备查询）
  all_data->run_status.dev_query = modbus_get_uint16(data_buf, 26);
  // 0x18B2（闪灯时长）
  all_data->run_status.flash_duration = modbus_get_uint16(data_buf, 28);
  // 0x18B3（清除电量命令）
  all_data->run_status.clear_energy_cmd = modbus_get_uint16(data_buf, 30);
  // 0x18B4~0x18B5（母排计量电压2，32位有符号）
  all_data->run_status.bus_meter_volt_2 = modbus_get_int32(data_buf, 32);

  return 0;
}
int modbus_parse_1900_190E(const uint8_t *resp_buf, uint16_t resp_len, Modbus_AllData *all_data)
{
  // 合法性验证：1+1+1+15×2+2=35字节
  if (resp_len < 35)
    return -1;
  if (resp_buf[1] != 0x03)
    return -1;
  if (resp_buf[2] != 30)
    return -2; // 15寄存器×2=30字节

  const uint8_t *data_buf = &resp_buf[3];

  // 0x1900~0x1903（厂家SN，8字节）
  memcpy(all_data->dev_info.factory_sn, data_buf, 8);
  // 0x1904~0x1905（软件版本，XX.XX）
  uint16_t ver_high = modbus_get_uint16(data_buf, 8); // 高16位（如0x0063=99）
  uint16_t ver_low = modbus_get_uint16(data_buf, 10); // 低16位（如0x0063=99）
  all_data->dev_info.software_version = (float)ver_high + (float)ver_low / 100.0f;
  // 0x190C（开关宽度）
  all_data->dev_info.switch_width = modbus_get_uint16(data_buf, 24); // 0x1906~0x190B预留，偏移+16=24
  // 0x190D（额定电压+壳架电流）
  all_data->dev_info.rated_volt = data_buf[26];    // 0x190D高字节
  all_data->dev_info.frame_current = data_buf[27]; // 0x190D低字节
  // 0x190E（额定电流）
  all_data->dev_info.rated_current = modbus_get_uint16(data_buf, 28);

  return 0;
}
int modbus_parse_3000_3009(const uint8_t *resp_buf, uint16_t resp_len, Modbus_AllData *all_data)
{
  // 合法性验证：1+1+1+10×2+2=25字节
  if (resp_len < 25)
    return -1;
  if (resp_buf[1] != 0x03)
    return -1;
  if (resp_buf[2] != 20)
    return -2; // 10寄存器×2=20字节

  const uint8_t *data_buf = &resp_buf[3];

  // 0x3000（控制命令）
  all_data->user_param.control_cmd = modbus_get_uint16(data_buf, 0);
  // 0x3001（过压保护使能）
  all_data->user_param.over_volt_en = modbus_get_uint16(data_buf, 2);
  // 0x3002（过压保护阈值）
  all_data->user_param.over_volt_thr = modbus_get_uint16(data_buf, 4);
  // 0x3003（过流保护模式）
  all_data->user_param.over_current_mode = modbus_get_uint16(data_buf, 6);
  // 0x3004（过流保护阈值）
  all_data->user_param.over_current_thr = modbus_get_uint16(data_buf, 8);
  // 0x3005（过压保护延时）
  all_data->user_param.over_volt_delay = modbus_get_uint16(data_buf, 10);
  // 0x3006（过流定时限延时）
  all_data->user_param.over_current_delay = modbus_get_uint16(data_buf, 12);
  // 0x3007（欠压保护使能）
  all_data->user_param.under_volt_en = modbus_get_uint16(data_buf, 14);
  // 0x3008（欠压保护阈值）
  all_data->user_param.under_volt_thr = modbus_get_uint16(data_buf, 16);
  // 0x3009（欠压保护延时）
  all_data->user_param.under_volt_delay = modbus_get_uint16(data_buf, 18);

  return 0;
}
int modbus_parse_3016_301E(const uint8_t *resp_buf, uint16_t resp_len, Modbus_AllData *all_data)
{
  // 合法性验证：1+1+1+9×2+2=23字节
  if (resp_len < 23)
    return -1;
  if (resp_buf[1] != 0x03)
    return -1;
  if (resp_buf[2] != 18)
    return -2; // 9寄存器×2=18字节

  const uint8_t *data_buf = &resp_buf[3];

  // 0x3016（端口过温使能）
  all_data->user_param.port_ot_en = modbus_get_uint16(data_buf, 0);
  // 0x3017（端口过温阈值）
  all_data->user_param.port_ot_thr = modbus_get_uint16(data_buf, 2);
  // 0x3018（端口过温延时）
  all_data->user_param.port_ot_delay = modbus_get_uint16(data_buf, 4);
  // 0x301C（板载过温使能，0x3019~0x301B预留，偏移+6=12）
  all_data->user_param.board_ot_en = modbus_get_uint16(data_buf, 12);
  // 0x301D（板载过温阈值）
  all_data->user_param.board_ot_thr = modbus_get_uint16(data_buf, 14);
  // 0x301E（板载过温延时）
  all_data->user_param.board_ot_delay = modbus_get_uint16(data_buf, 16);

  return 0;
}
int modbus_parse_302E_3036(const uint8_t *resp_buf, uint16_t resp_len, Modbus_AllData *all_data)
{
  // 合法性验证：1+1+1+9×2+2=23字节
  if (resp_len < 23)
    return -1;
  if (resp_buf[1] != 0x03)
    return -1;
  if (resp_buf[2] != 18)
    return -2; // 9寄存器×2=18字节

  const uint8_t *data_buf = &resp_buf[3];

  // 0x302E（过压自恢复使能）
  all_data->user_param.over_volt_recover_en = modbus_get_uint16(data_buf, 0);
  // 0x302F（欠压自恢复使能）
  all_data->user_param.under_volt_recover_en = modbus_get_uint16(data_buf, 2);
  // 0x3030（电压恢复回差值）
  all_data->user_param.volt_recover_hyst = modbus_get_uint16(data_buf, 4);
  // 0x3031（过流自动重合使能）
  all_data->user_param.over_current_reclose_en = modbus_get_uint16(data_buf, 6);
  // 0x3032（过流重合延时）
  all_data->user_param.over_current_reclose_delay = modbus_get_uint16(data_buf, 8);
  // 0x3033（过流重合次数）
  all_data->user_param.over_current_reclose_cnt = modbus_get_uint16(data_buf, 10);
  // 0x3034（过流报警阈值）
  all_data->user_param.over_current_alarm_thr = modbus_get_uint16(data_buf, 12);
  // 0x3035（用户代码）
  all_data->user_param.user_code = modbus_get_uint16(data_buf, 14);
  // 0x3036（空开断开告警方式）
  all_data->user_param.air_switch_alarm_mode = modbus_get_uint16(data_buf, 16);

  return 0;
}

